package java学习.第07章_面向对象编程_进阶;

/**
 * 多态性
 * 符合了开闭原则
 *  1.理解多态性：可以理解为一个事物的多种形态。
 *  2.何为多态性：
 *    对象的多态性：父类的引用指向子类的对象（或子类的对象赋给父类的引用）
 *  3. 多态的使用：虚拟方法调用
 *    有了对象的多态性以后，我们在编译期，只能调用父类中声明的方法，
 *    但在运行期，我们实际执行的是子类重写父类的方法。
 *    总结：编译，看左边；运行，看右边。
 *  4.多态性的使用前提： ① 类的继承关系  ② 方法的重写
 *  5.对象的多态性，只适用于方法，不适用于属性（编译和运行都看左边）
 *
 *
 *  对象的向上转型：父类 父类对象 = 子类实例
 *  对象的向下转型：子类 子类对象 = （子类）父类实例 为什么要发生向下转型？当父类需要调用子类的扩充方法时，才需要向下转型。
 *
 *  好处：
 *      极大地减少了代码的冗余，不需要定义多个重载的方法
 *       开闭原则：对扩展开发对修改关闭
 *       讲抽象类和接口后，会有更好的理解
 *  弊端：
 *    针对与  new的子类，加载了子类的所有的属性和方法，
 *           但是子类特有的方法和所有的属性都不能使用
 *
 *  在多态的情况下，只能使用父类有的方法
 *  但是再重写的情况下，执行的结果是子类的实现结果
 */
public class E_面向对象特征之多态性 {//父类的引用指向子类的对象
    public static void main(String[] args) {
        Toy toy0 = new ToyCar();//
        Toy toy1 = new BuildingBlock();
        System.out.println(toy1.getClass());//new 的对象
        //父类的引用(这个方法指向的是父类的方法)，但是实现是子类的实现，
        toy0.ability();//玩具车
        toy1.ability();//积木
        //不能使用，因为父类的引用，所以只能使用父类有的方法
        //toy1.jk();
        System.out.println("--------------------------- ");
        //但是属性还是父类的属性，不会被子类覆盖
        System.out.println(toy0.i);
        System.out.println(toy1.i);
    }
}
class ToyCar extends Toy{
    int i = 1;
    public void ability(){
        System.out.println("玩具车");
    }
}
class  BuildingBlock extends Toy {//积木
    int i = 2;
    public void ability(){
        System.out.println("积木");
    }
    public void jk(){
        System.out.println("多合一");
    }
}
class Toy{//玩具
    int i = 0;
    public void ability(){
        System.out.println("玩具");
    }
}
